package com.hh.core.interceptor;

import javax.naming.NoPermissionException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import cn.hutool.core.util.ObjectUtil;

import com.hh.admin.exception.LoginErrorException;
import com.hh.core.common.constant.SysConstant;
import com.hh.core.enums.ExceptionEnum;
import com.hh.core.shiro.check.PermissionCheckManager;
import com.hh.core.shiro.util.ShiroUtil;

/**
 * springmvc 拦截器
* @ClassName: SessionTimeoutInterceptor  
* @Description: TODO(session 过期拦截器)  
* @author hxn
* @date 2018年1月19日 下午4:04:05  
*
 */
public class ShiroPermissionInterceptor extends HandlerInterceptorAdapter{
	
	/**
	 * 在DispatcherServlet完全处理完请求后被调用 
	 * 
	 *   当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion()
	 */
	@Override
	public void afterCompletion(HttpServletRequest request,
			HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		super.afterCompletion(request, response, handler, ex);
	}
	
	//在业务处理器处理请求执行完成后,生成视图之前执行的动作 
	@Override
	public void postHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		// TODO Auto-generated method stub
		super.postHandle(request, response, handler, modelAndView);
	}
	
	/**
	 * 在业务处理器处理请求之前被调用
	 * 如果返回false
	 *     从当前的拦截器往回执行所有拦截器的afterCompletion(),再退出拦截器链
	 * 
	 * 如果返回true
	 *    执行下一个拦截器,直到所有的拦截器都执行完毕
	 *    再执行被拦截的Controller
	 *    然后进入拦截器链,
	 *    从最后一个拦截器往回执行所有的postHandle()
	 *    接着再从最后一个拦截器往回执行所有的afterCompletion()
	 */
	@Override
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		//登录过期
		if(ObjectUtil.isNull(ShiroUtil.getSession().getAttribute(SysConstant.SESSION_FLAG))){
			ShiroUtil.getSubject().logout();
			throw new LoginErrorException(ExceptionEnum.LOGIN_EXPIRES);  //登录过期
		}
		if(ShiroUtil.isAdmin()){    //是否为超级管理员
    		return true;     
    	}
		if(request.getServletPath().equals("/admin")){
			return true;
		}
		//检查是否有权限
        boolean result = PermissionCheckManager.checkAll();
        if(!result){
        	throw new NoPermissionException();
        }
		return true;
	}
}
